#ifndef GAMESTATE_OPTIONS_OPTIONSMENU_H
#define GAMESTATE_OPTIONS_OPTIONSMENU_H


#include "Interface/Menu.h"
#include "Engine/Reason.h"
#include "Engine/Sense.h"
#include "Engine/Visual.h"
#include <string>
#include "Engine/Resource/Graphic.h"
#include <list>
#include "SDL.h"

namespace Misc { struct Frame; } 
namespace GameState { template<typename T> class DataStorage; } 

namespace GameState {

namespace Options {

class OptionEntry : public Interface::Menu::MenuEntry, public Engine::Reason, public Engine::Sense, public Engine::Visual {
  protected:
	bool focused; 

  public:
	OptionEntry(const Misc::Frame & frame, std::string name); 
	virtual ~OptionEntry(); 
	virtual void select() = 0; // Menu entry was selected
	virtual void pulse(int delta) = 0; 
	inline virtual void exit() = 0; 
	virtual Engine::Resource::GraphicList display() = 0; // Asks for generation of a graphical model to be displayed
};
class PictureTargetOption : public OptionEntry {
  private:
	Engine::Resource::Graphic focusGfx; 
	std::list<std::string> targetList; 
	std::list<std::string>::iterator currentTarget; 
	Engine::Resource::Graphic * loadedGraphic; 

  public:
	PictureTargetOption(const Misc::Frame & frame); 
	virtual void select(); // Menu entry was selected
	virtual void pulse(int delta); 
	inline virtual void exit(); 
	virtual Engine::Resource::GraphicList display(); // Asks for generation of a graphical model to be displayed
	virtual void haveFocus(bool focused); // Menu entry have focus.
	virtual void keyDown(SDLKey sym, SDLMod mod, Uint16 unicode); 
};
inline void PictureTargetOption::exit() {
}

class LevelOption : public OptionEntry {
  private:
	Engine::Resource::Graphic focusGfx; 
	Engine::Resource::Graphic levelString; 
	Engine::Resource::Graphic easyMode; 
	Engine::Resource::Graphic hardMode; 

  public:
	LevelOption(const Misc::Frame & frame); 
	virtual void select(); // Menu entry was selected
	virtual void pulse(int delta); 
	inline virtual void exit(); 
	virtual Engine::Resource::GraphicList display(); // Asks for generation of a graphical model to be displayed
	virtual void haveFocus(bool focused); // Menu entry have focus.
	virtual void keyDown(SDLKey sym, SDLMod mod, Uint16 unicode); 
};
inline void LevelOption::exit() {
}

class SoundThemeOption : public OptionEntry {
  private:
	Engine::Resource::Graphic focusGfx; 

  public:
	SoundThemeOption(const Misc::Frame & frame); 
	virtual void select(); // Menu entry was selected
	virtual void pulse(int delta); 
	inline virtual void exit(); 
	virtual Engine::Resource::GraphicList display(); // Asks for generation of a graphical model to be displayed
	virtual void haveFocus(bool focused); // Menu entry have focus.
};
inline void SoundThemeOption::exit() {
}


} // namespace GameState::Options

} // namespace GameState
#endif
